package com.example.demo.services;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.port.fee.entity.FeeRecord;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 费用记录服务接口
 */
public interface FeeRecordService extends IService<FeeRecord> {

    /**
     * 根据ID获取费用记录
     * 
     * @param feeId 费用记录ID
     * @return 费用记录
     */
    FeeRecord getFeeRecordById(Long feeId);

    /**
     * 分页查询费用记录
     * 
     * @param feeRecord 查询条件
     * @param pageNum   页码
     * @param pageSize  每页记录数
     * @return 分页结果
     */
    Page<FeeRecord> listFeeRecords(FeeRecord feeRecord, int pageNum, int pageSize);

    /**
     * 计算费用记录
     * 
     * @param cargoId     货物ID
     * @param calcEndDate 计算截止日期，如果为null则使用当前日期
     * @return 计算结果
     */
    FeeRecord calculateFee(Long cargoId, Date calcEndDate);

    /**
     * 添加费用记录
     * 
     * @param feeRecord 费用记录
     * @return 是否成功
     */
    boolean addFeeRecord(FeeRecord feeRecord);

    /**
     * 更新费用记录
     * 
     * @param feeRecord 费用记录
     * @return 是否成功
     */
    boolean updateFeeRecord(FeeRecord feeRecord);

    /**
     * 确认支付费用
     * 
     * @param feeId 费用ID
     * @return 是否成功
     */
    boolean confirmPayment(Long feeId);

    /**
     * 获取货物相关的费用总额
     * 
     * @param cargoId 货物ID
     * @return 费用总额
     */
    BigDecimal getTotalFeeByCargoId(Long cargoId);

    /**
     * 按费用类型统计收入
     * 
     * @return 统计结果
     */
    List<Map<String, Object>> statisticsByFeeType();

    /**
     * 按客户统计费用
     * 
     * @return 统计结果
     */
    List<Map<String, Object>> statisticsByCustomer();
}